package javaNIO1.channel;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;

/**
 * Created with Intel IDEA.
 * SocketChannel
 * SocketChannel 是面向流的，有连接的 即可以用下tcp/ip 协议 （必须连接了才有用，并且只能连接一次）
 * @Auther: gjt
 * @Date: 2024/7/20 16:24
 */
public class socketChannel1 {
    private static final String SERVER = "time.nist.gov";
    private static final int port = 13;
    private static final int TIMEOUT = 15000;
    public static void main(String[] args) {
        try(Socket socket = new Socket(SERVER,port);FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\23152\\Desktop\\hello.txt")){
            // 设置Socket 超时时间防止连接服务器超时挂机
            socket.setSoTimeout(TIMEOUT);
            // 设置socket 非阻塞模式


            try(SocketChannel socketChannel = socket.getChannel();FileChannel fileChannel = fileOutputStream.getChannel();){
                socketChannel.configureBlocking(false);

                fileChannel.transferFrom(socketChannel,0,fileChannel.size());

            }catch (IOException ex){
                ex.printStackTrace();
            }

        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 新创建的SocketChannel 虽然已经打开但是是未连接的：在未连接的SocketChannel 上进行I/O操作 会抛出NotYetConnectedException
     * 可以使用通道的connect方法或者使用它关联的socket 对象上调用connect方法，
     * 连接之后，不一定会链接成功 ，可以使用isConnected方法判断是否已经连接成功
     */

    private static void test(){
        // 这个是先创建 后链接
        try (SocketChannel socketChannel = SocketChannel.open()) {
            socketChannel.connect(new InetSocketAddress("152.136.138.218", 13));
        } catch (IOException e) {
            e.printStackTrace();
        }


        // 和上边一致 这个是在创建时并连接
        try(SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("152.136.138.218", 13))){

        }catch (IOException e){e.printStackTrace();}
    }

}
